package com.easylinkin.linkappapi.device.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easylinkin.linkappapi.device.entity.Device;
import com.easylinkin.linkappapi.device.entity.DeviceInfo;
import com.easylinkin.linkappapi.device.entity.vo.DeviceModelQueryVo;
import com.easylinkin.linkappapi.device.entity.vo.DeviceQueryVo;
import com.easylinkin.linkappapi.device.vo.DeviceTypeCountVo;
import com.easylinkin.linkappapi.device.vo.DeviceStatisticsVo;
import com.easylinkin.linkappapi.deviceattributestatus.entity.DeviceAttributeStatus;
import com.easylinkin.linkappapi.machinery.dto.DeviceMachineryDto;
import com.easylinkin.linkappapi.machinery.vo.MachineryDeviceVo;
import com.easylinkin.linkappapi.openapi.dto.CameraCountByProjectDTO;
import com.easylinkin.linkappapi.reportCenter.entity.ReportDevice;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author TongJie
 * @since 2020-04-14
 */
public interface DeviceMapper extends BaseMapper<Device> {

    /**
     * 查询设备
     */
    List<Device> selectDevices(@Param("device") Device device);

    /**
     * 查询模块下所有设备
     *
     * @param page
     * @param device
     * @return
     */
    List<Device> selectModelDevices(Page page, @Param("device") Device device);

    /**
     * 查询模块下所有设备
     *
     * @param device
     * @return
     */
    List<Device> selectModelDevices(@Param("device") DeviceModelQueryVo device);


    /**
     * 查询设备位置信息 设备地图标注位置 用到
     */
    List<Device> getDeviceSiteInfos(@Param("device") Device device);

    IPage<Device> getDeviceSiteInfos(Page page, @Param("device") Device device);

    List<Device> selectDevicesByAreaPath(Device device);

    List<Device> selectDevices(Page page, @Param("device") Device device);

    List<Device> selectDevicesFilter(Page page, @Param("device") Device device);

    List<Device> selectDevicesFilter(@Param("device") Device device);

    /***
     * 查询所有设备，并获取绑定关系
     * @param page
     * @param device
     * @return
     */
    List<Device> selectDevicesFilterDifferBind(Page page, @Param("device") Device device);

    List<Device> selectDevicesWithAlarmRule(Page page, @Param("device") Device device);


    /**
     * 根据ids 查询资产id
     */
    List<String> selectAssetIdsByIds(@Param("ids") List<String> ids);

    List<DeviceAttributeStatus> getAttributeStatusList(@Param("code") String deviceCode);

    /**
     * 按照类型统计
     */
    List<Map<String, Object>> getStatisticsByType(Device device);

    /**
     * 按照类型统计  类型下有设备的 且类型名不为空的
     */
    List<DeviceTypeCountVo> getStatisticsExistDeviceByType(@Param("device") Device device);

    /**
     * 根据设备状态统计设备数
     */
    List<Map<String, Object>> countDeviceByStatus(@Param("device") Device device);

    /**
     * 根据设备在线状态 统计设备数
     */
    List<Map<String, Object>> countDeviceByOnlineState(@Param("device") Device device);


    /**
     * 统计设备数量
     */
    List<Map> getStatisticsDeviceCount(@Param("current") long current, @Param("size") long size, @Param("device") Device device);

    /**
     * 统计设备增量趋势
     */
    List<Map> getStatisticsDeviceAddUpCount(@Param("current") long current, @Param("size") long size, @Param("device") Device device);

    /**
     * 统计设备
     */
    List<DeviceInfo> getDeviceStatisticsAudit(@Param("device") Device device);

    void insertDeviceInfo(DeviceInfo deviceInfo);

    void updateDeviceInfo(DeviceInfo deviceInfo);

    List<DeviceInfo> selectDeviceInfoList(DeviceInfo deviceInfo);

    /**
     * 统计设备在线离线
     */
    List<Map> getStatisticsDeviceOnlineOffLine(@Param("device") Device device);

    List<Device> selectDeviceByCodeGlobal(@Param("code") String code);

    /**
     * 监控页设备查询
     */
    IPage<Device> getMonitorDevices(Page page, @Param("device") Device device);

    /**
     * 监控页设备查询
     */
    List<Device> getMonitorDevices(@Param("device") Device device);

    /**
     * 高级查询
     */
    IPage<Device> getMonitorDevicesWithProperties(Page page, @Param("device") Device device);

    /**
     * 电力监控页设备状态查询
     *
     * @param distributionRoomId 配电房id
     * @return 设备列表
     */
    List<Device> getDistributionMonitorDevices(@Param("distributionRoomId") String distributionRoomId);

    List<DeviceAttributeStatus> getAttributesList(@Param("pDeviceUnitId") String pDeviceUnitId, @Param("pCode") String pCode, @Param("pTenantId") String pTenantId);

    /**
     * 查询批量设备的属性列表
     */
    List<DeviceAttributeStatus> getBatchAttributesList(@Param("pDeviceUnitId") String pDeviceUnitId, @Param("pCode") List<String> pCode, @Param("pTenantId") String pTenantId);

    List<Device> selectDevicesByCodes(@Param("deviceCodes") Set<String> deviceCodes, @Param("device") Device device);

    /**
     * 查询租户的摄像头设备
     */
    List<Device> selectCameraDevices(@Param("tenantId") String tenantId);

    /***
     * 修改设备空间区域
     * @param device
     * @return
     */
    int updateDeviceAreaById(@Param("device") Device device);

    /**
     * lqh
     * 增强版，缺少数据可继续扩展，如需要继续对数据筛选，可在业务层进行过滤
     * 根据条件按设备型号进行分组获取设备总数、正常数、离线数、告警数
     */
    List<Map<String, Object>> getDeviceCountAndStrengthenByUnitCode(Device device);

    List<Map<String, String>> statisticDeviceStatusCountBySpace(@Param("device") Device device);

    /**
     * 根据tenantId删除deviceInfo
     *
     * @param id
     */
    void deleteInfo(String tenantId);

    /**
     * 根据设备属性与状态查询统计数目
     *
     * @param device
     * @return
     */
    long countByDevice(@Param("deviceQueryVo") DeviceQueryVo device);

    /**
     * 根据条件查询设备编号
     *
     * @param deviceQueryVo 查询vo
     * @return 设备编号列表
     */
    List<String> selectDeviceCodes(@Param("deviceQueryVo") DeviceQueryVo deviceQueryVo);

    List<String> getDeleteRepeatedDeviceAttrStatusIds();

    List<Device> getMonitorDevice(@Param("tenantId") String tenantId, @Param("deviceUnitIds") List<String> deviceUnitIds);

    /**
     * 查询电子档案IOT设备DTO信息list
     *
     * @param machineryDeviceVo 电子档案设备vo
     * @return 电子档案IOT设备DTO信息list
     */
    List<DeviceMachineryDto> selectDeviceMachineryDtoList(MachineryDeviceVo machineryDeviceVo);

    /**
     * 查询电子档案IOT设备DTO信息list，不查询绑定关系
     *
     * @param machineryDeviceVo 电子档案设备vo
     * @return 电子档案IOT设备DTO信息list
     */
    List<DeviceMachineryDto> selectDeviceMachineryDtoNoRefList(MachineryDeviceVo machineryDeviceVo);

    List<Map<String, Object>> countDeviceByOnlineStateGlobal(@Param("device") Device device);

    /**
     * 查询改设备是否属于ai相机
     *
     * @param deviceCode
     * @return
     */
    Device findAiDeviceByCode(String deviceCode);

    /**
     * 根据code集合查询未删除的设备
     *
     * @param codes
     * @param tenantId
     * @return
     */
    List<Device> findDeviceByCodesGlobal(@Param("codes") Set<String> codes, @Param("tenantId") String tenantId);

    /**
     * 根据项目id 查询摄像头在线离线数目
     *
     * @param projectIds
     * @return
     */
    List<CameraCountByProjectDTO> getCameraCountByProjectIds(@Param("projectIds") List<Long> projectIds);

    List<Device> getDeviceListForGate(@Param("codes") List<String> codos, @Param("code") String code, @Param("deviceUnitNames") List<String> deviceUnitNames);

    /**
     * 设备运行报告统计
     * @param tenantId
     * @return
     */
    List<ReportDevice> countDeviceGlobal(String tenantId);

    /**
     * 查询AI设备
     * @param tenantId
     * @param deviceTypeName
     * @return
     */
    List<Device> countAIDeviceGlobal(@Param("tenantId") String tenantId, @Param("deviceTypeName") String deviceTypeName);

    List<Device> selectByDeviceTypeName(@Param("tenantId") String tenantId, @Param("deviceTypeName") String deviceTypeName);

    void updateStatusById(@Param("id") String id, @Param("status") Integer status);

    /**
     * 按租户统计设备总数、在线数、离线数
     * @param tenantId 租户ID
     * @return 设备统计结果
     */
    DeviceStatisticsVo getDeviceStatisticsByTenantId(@Param("tenantId") String tenantId, @Param("deviceTypes") List<String> deviceTypes);
}
